package com.webchat.common.config.aop;


import com.webchat.common.config.annotation.ExecAfterCall;
import com.webchat.common.util.SpringContextUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
public class ExecAfterCallAspect {


    @AfterReturning(pointcut = "@annotation(execAfterCall)")
    public void doExecAfterCall(JoinPoint joinPoint, ExecAfterCall execAfterCall) throws Exception {

        // 获取注解传递目标类对象
        Class<?> targetClass = execAfterCall.clazz();
        String methodName = execAfterCall.method();
        // 获取要回调方法
        Method method = targetClass.getDeclaredMethod(methodName);
        if (isStaticMethod(method)) {
            // 如果回调方法是静态方法，直接调用
            method.invoke(null);
        } else {
            // spring上下文获取目标类对应bean对象，走反射回调方法
            Object bean = SpringContextUtil.getBean(targetClass);
            method.invoke(bean);
        }
    }

    private boolean isStaticMethod(Method method) {

        return java.lang.reflect.Modifier.isStatic(method.getModifiers());
    }


}
